const Question = require('../models/questions');

class QuestionsCtl {

  // 查看问题的提问者是否存在 (中间件)
  async checkQuestionExist(ctx, next) {
    const question = await Question.findById(ctx.params.id).select('+questioner');
    if (!question) { ctx.throw(404, '问题不存在'); }
    // 存在了ctx上了后面的中间件就不用再查一次了
    ctx.state.question = question;
    await next();
  }

  // 查看是否是本人在操作 (中间件)
  async checkQuestioner(ctx, next) {
    const { question } = ctx.state;
    if (question.questioner.toString() !== ctx.state.user._id) { ctx.throw(403, '没有权限'); }
    await next();
  }

  // 新增一个问题
  async create(ctx) {
    ctx.verifyParams({
      title: { type: 'string', required: true },
      description: { type: 'string', required: false }

    })
    const question = await new Question({ ...ctx.request.body, questioner: ctx.state.user._id }).save();
    ctx.body = question;
  }

  // 查询指定的问题
  async findById(ctx) {
    const { fields = '' } = ctx.query;
    const selectFields = fields.split(';').filter(f => f).map(f => ' +' + f).join('');
    const question = await Question.findById(ctx.params.id).select(selectFields).populate('questioner topics');
    ctx.body = question;
  }


  // 获取问题列表（可分页）（可查询关键字）
  async find(ctx) {
    let { page_size = 10, page: currentPage = 1 } = ctx.query;

    currentPage = Math.max(currentPage * 1, 1)
    const pageSize = Math.max(page_size * 1, 1)
    const q = new RegExp(ctx.query.q)
    // $or只要满足一个即可
    ctx.body = await Question.find({ $or: [{ title: q }, { description: q }] }).limit(pageSize).skip((currentPage - 1) * pageSize)
  }

  // 更新问题(更新前要检查用户提的问题是否存在)
  async update(ctx) {
    ctx.verifyParams({
      title: { type: 'string', required: false },
      description: { type: 'string', require: false }
    })
    // findById + update()
    await ctx.state.question.update(ctx.request.body)
    ctx.body = ctx.state.question;
  }

  // 删除问题
  async delete(ctx) {
    await Question.findByIdAndRemove(ctx.params.id);
    ctx.status = 204;
  }
}


module.exports = new QuestionsCtl();